import 'dart:io';
import 'package:bot_toast/bot_toast.dart';
import 'package:path_provider/path_provider.dart';

/*
 * 计算清除缓存
 */
class ClearCache {

  ///加载缓存
  static Future<dynamic> loadCache() async {
    try {
      ///通过flutter临时缓存路径获取缓存文件
      Directory tempDir = await getTemporaryDirectory();
      double value = await ClearCache._getTotalSizeOfFilesInDir(tempDir);

      return ClearCache._renderSize(value);
    } catch (err) {
      print(err);
    }
  }

  // 清理缓存
  static Future<bool> clearCache() async {
    CancelFunc loading  =  BotToast.showLoading();
    try {
      Directory tempDir = await getTemporaryDirectory();
      //删除缓存目录
      await ClearCache.delDir(tempDir);
      return true;
    } catch (e) {
      print(e);
      return false;
    } finally {
      loading();
    }
  }

  /// 递归方式 计算文件的大小
  static Future<double> _getTotalSizeOfFilesInDir(final FileSystemEntity file) async {
    try {
      ///如果是文件的话 直接返回文件大小
      if (file is File) {
        int length = await file.length();
        return double.parse(length.toString());
      }
      ///如果是目录的话 将目录分为下一级的数组 然后再循环去调用此方法 直到分为文件
      if (file is Directory) {
        final List<FileSystemEntity> children = file.listSync();
        double total = 0;
        for (final FileSystemEntity child in children)
          total += await ClearCache._getTotalSizeOfFilesInDir(child);
        return total;
      }
      return 0;
    } catch (e) {
      print(e);
      return 0;
    }
  }

  ///递归方式删除目录
  static Future<Null> delDir(FileSystemEntity file) async {
    try {
      if (file is Directory) {
        final List<FileSystemEntity> children = file.listSync();
        for (final FileSystemEntity child in children) {
          await delDir(child);
        }
      }
      await file.delete();
    } catch (e) {
      print(e);
    }
  }

  /// 格式化文件大小
  static String _renderSize(double value) {
    ///先做好一个存单位的数组
    List<String> unitArr = []..add('B')..add('K')..add('M')..add('G');
    int index = 0;
    ///将传来的文件大小按照while循环除以8024 循环条件为除后的值大于1024 每循环一次 取单位数组后一位
    ///最后将剩下的值省略小数点后两位 然后拼接单位返回
    while (value > 1024) {
      index++;
      // value = value / 1024;
      value = value / 1024;
    }
    String size = value.toStringAsFixed(2);
    return size + unitArr[index];
  }

}